:- expects_dialect(lps).

end_of_file.
% @TODO unbreak

% consolidated loan example.

:- include(system('date_utils.pl')).  

simulatedRealTimeBeginning('2014-05-31'). % The date of the initial state at cycle 1.
simulatedRealTimePerCycle(21600). % Each cycle = 21600 seconds = 1/4th of a day.
maxTime(3200). % 3200 cycles = 800 days.

events 		request/2, advance/2.
fluents 	requested/3, advanced/2, legal_action_against/1, terminated.

request(Borrower, Amount) initiates requested(Borrower, Amount, Date)
if real_date(Date).

advance(Lender, Amount) initiates advanced(Lender, Amount).

end_of_day(2014/6/1)
initiates terminated
if not requested(borrower, 1000, 2014/6/1).

end_of_day(2014/6/2)
initiates legal_action_against(lender)
if requested(borrower, 1000, 2014/6/1), 
not advanced(lender, 1000).

events 		pay/3.
fluents 	paid/4, potential_defaulted/1.

due(550, 2015/6/1). 
due(525, 2016/6/1).

end_of_day(Date) initiates
potential_defaulted(pay(borrower, lender, Amount))
if due(Amount, Date),
not paid(borrower, lender, Amount, Date).

false 	pay(borrower, lender, Amount), due(Amount, Date2), 
		real_date(Date1), Date1 @< Date2.

pay(Borrower, Lender, Amount) 	initiates paid(Borrower, Lender, Amount, Date)
								if 	real_date(Date).

events notify/2.
fluents defaulted/2, notified/3, remedied/1,
cured/1. % shouldn't be necessary.

notify(Person, Message) initiates notified(Person, Message, Date)
						if 	real_date(Date).
/*
end_of_day(Date2)
initiates defaulted(Requirement, Date2) 
if 	potential_defaulted( Requirement),
	notified(lender, default(Requirement), Date1),
	real_date_add(Date1, 2, Date2),
	not defaulted(_, _), % In the event of multiple events of default,
	% the first to occur shall take precedence 
	% for the purposes of specifying outcomes under this agreement.
	not cured(Requirement). 
*/

end_of_day(Date2)
initiates defaulted(Requirement, Date3) % Date2???
if 	potential_defaulted( Requirement),
	notified(lender, default(Requirement), Date1),
	real_date_add(Date1, 2, Date2),
	real_date_add(Date1, 3, Date3),
	not defaulted(_, _), % In the event of multiple events of default,
	% the first to occur shall take precedence 
	% for the purposes of specifying outcomes under this agreement.
	not cured(Requirement). 


cured(Requirement) at T
if 	remedied(Requirement) at T, 
	notified(borrower, remedy(Requirement), _) at T.

pay(borrower, lender, Amount)
initiates 	remedied(pay(borrower, lender, Amount))
if 	potential_defaulted(pay(borrower, lender, Amount)).

events file/2.

file(borrower, bankruptcy) initiates 
potential_defaulted(bankruptcy_insolvency(borrower)).

file(borrower, insolvency) initiates 
potential_defaulted(bankruptcy_insolvency(borrower)).

events remedy/1.

remedy(Violation) initiates
remedied(Violation).

events prove_untrue/1.

prove_untrue(Requirement) initiates
potential_defaulted(Requirement) if represents_warrants(borrower, Requirement).

represents_warrants(borrower, 
                   `borrower's assets exceed liabilities at time T 
                    if borrower executes contract at time T
                    or borrower requests funds at time T
                    or due(Amount, Date) and T is on or before Date`).

events fails_to_perform/2.

fails_to_perform(borrower, Requirement) initiates
potential_defaulted(Requirement) if covenant(borrower, Requirement).

covenant(borrower,
         `pay borrower tax at time T 
          if tax due at time T
          and borrower executes contract at time T
              or borrower requests funds at time T
              or due(Amount, Date) and T is on or before Date`).

total_due(1075) at T if not paid(borrower, lender, 550,_) at T.
total_due(525) at T if paid(borrower, lender, 550,_), not paid(borrower, lender, 525,_) at T. 

end_of_day(Date)
initiates legal_action_against(borrower)
if 	defaulted(_, Date), 
	Date @< 2020/06/01, % within NY State Statute of Limitation. 
	total_due(Sum),
	not paid(borrower, lender, Sum, Date).

pay(borrower, lender, Sum) initiates terminated
if 	defaulted(_, Date),
	real_date(Date),
	total_due(Sum).

pay(borrower, lender, 525) initiates terminated
if 	not defaulted(_, _), 
	paid(borrower, lender, 550,_).

/*
end_of_day(Date)
initiates terminated
if 	defaulted(_, Date), 
%	Date @< 2020/06/01, % within NY State Statute of Limitation. not needed?
	total_due(Sum),
	paid(borrower, lender, Sum, Date).

pay(borrower, lender, 525) initiates terminated
if 	not defaulted(_, _), 
	paid(borrower, lender, 550,_).


pay(borrower, lender, Sum) initiates terminated
if 	not legal_action_against(borrower),
	total_due(Sum).

pay(borrower, lender, 525) initiates terminated
if 	not legal_action_against(borrower),
	paid(borrower, lender, 550,_).
*/

observe request(borrower, 1000) at '2014-06-01T15:00'. % at 15:00.
observe advance(lender, 1000) at '2014-06-02T18:00'.
observe pay(borrower,lender, 550) at '2015-06-01T12:00'.
observe pay(borrower,lender, 525) at '2016-06-04T06:00'. % change date: earlier or later.
observe notify(lender, default(pay(borrower, lender, 525))) at '2016-06-02'.